package com.example.easyexcel.controller;

import com.alibaba.excel.EasyExcel;
import com.example.easyexcel.listener.UploadDataListener;
import com.example.easyexcel.pojo.DownloadData;
import com.example.easyexcel.pojo.Student;
import com.example.easyexcel.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

@RequestMapping("/")
@Controller
public class EasyExcelController {

    @Autowired
    private StudentService studentService;
    /**
     * 文件下载（失败了会返回一个有部分数据的Excel）
     * <p>1. 创建excel对应的实体对象 参照{@link DownloadData}
     * <p>2. 设置返回的 参数
     * <p>3. 直接写，这里注意，finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     *
     * 总结：1.导出excel，只需要将data()方法方法中的数据替换成数据中传出来的数据
     *       2.DownloadData对象里，决定了输出excel表的格式。（不能遗漏相关注解）
     *       3.测试，直接启动项目，在浏览器中访问地址@GetMapping("download")。
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), Student.class)
                .sheet("模板")
                .doWrite(data());
    }

    @GetMapping("download22")
    public int download(){
        return studentService.isnertShuju();
    }

    /**
     * 文件上传
     * <p>1. 创建excel对应的实体对象 参照{@link }
     * <p>2. 由于默认一行行的读取excel，所以需要创建excel一行一行的回调监听器，参照{@link UploadDataListener}
     * <p>3. 直接读即可
     *
     * 总结：1.uploadDataListener：监听器加特定注解@Scope("prototype")
     *       2.studentService.readExcel(students);调用service层的读excel方法，
     *       将数据存入特定对象，在调用数据层方法存入数据库就好
     *       3.测试，使用postman,post请求@PostMapping("upload")
     *       Headers参数:key:Content-Type  value:multipart/form-data
     *       Body: 选着form-data
     *       key:file(传值的对象名) 选择file文件
     *       value:选择本地文件夹中的文件
     */

    @Autowired
    private UploadDataListener uploadDataListener;


    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            return "导入文件为空";
        }
        String fileName = file.getOriginalFilename();
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        if (!"xls".equals(suffix) && !"xlsx".equals(suffix)) {
            return "上传文件只支持xls和xlsx文件后缀;";
        }
        return null;
    }

    /**
     * 返回值list：就是把数据库中的数据获取到存入到list集合中
     * @return
     */
    private List<Student> data() {
        ArrayList<Student> list = new ArrayList<>();
        for (int i=0;i<100;i++) {
            Student s = new Student();
            s.setAccount("123l");
            s.setDepartment("hhh");
            list.add(s);
        }
        return list;
    }

    /**
     * easyExcel的导入
     */

}
